IF EXISTS (SELECT * FROM SYSOBJECTS WHERE name='spCompromisoSolicitud_Insert' and XTYPE='P')
BEGIN
	DROP PROCEDURE [dbo].[spCompromisoSolicitud_Insert]
END
GO
CREATE PROCEDURE [dbo].[spCompromisoSolicitud_Insert]
	 @OP VARCHAR(64)=NULL
	,@ParamAuxiliar NVARCHAR(MAX)=NULL
	,@Id INT=NULL
	,@CodSolicitud VARCHAR(32)=NULL
	,@CodOrdenCompra VARCHAR(32)=NULL
	,@CodContrato VARCHAR(32)=NULL
	,@FechaSolicitud DATETIME=NULL
	,@Activo BIT=NULL
	,@Observaciones VARCHAR(MAX)=NULL
	,@Estado VARCHAR(32)=NULL
	,@CodPresupuesto VARCHAR(16)=NULL
	,@Usuario VARCHAR(32)=NULL	
	,@IdProveedor VARCHAR(8)=NULL				
	,@NombreProveedor VARCHAR(256)=NULL	
	,@OrdenGlobal BIT=NULL 						
WITH ENCRYPTION
AS
SET NOCOUNT ON;
BEGIN TRY

/**** VERIFICAR SI LA SESSION DE USUARIO ESTA ACTIVA ****/
-----EXEC SP_ExecuteSQL N'dbo.spSeguridadUsuario @OP=''VerificarSessionActiva'''
/**** FIN - VERIFICAR SI LA SESSION DE USUARIO ESTA ACTIVA ****/--DECLARE @ERROR VARCHAR(500)

DECLARE @AUX VARCHAR(512)
DECLARE @AUX2 INT=0

/*****     OPERACION POR DEFECTO    *****/
IF @OP IS NULL OR @OP = ''
BEGIN
	BEGIN TRANSACTION
	
	IF NOT EXISTS (SELECT CodPresupuesto from PresupuestoAnualCabecera WHERE CodPresupuesto=@CodPresupuesto AND Publicado=1)
	BEGIN
		SET @AUX='El presupuesto '+@CodPresupuesto+' No ha sido creado o aun no ha sido publicado.'
		RAISERROR(@AUX,16,1)
		RETURN 1
	END
	
	-- Verifico si el presupuesto se encuentre Activo
	IF NOT EXISTS (SELECT CodPresupuesto from PresupuestoAnualCabecera WHERE CodPresupuesto=@CodPresupuesto AND Activo=1)
	BEGIN
		SET @AUX='El presupuesto '+@CodPresupuesto+' NO se encuentra Activo.'
		RAISERROR(@AUX,16,1)
		RETURN 1
	END
	
	IF ISNULL(RTRIM(@CodOrdenCompra),'')='' AND  ISNULL(RTRIM(@CodContrato),'')=''
	BEGIN
		SET @AUX='Debe seleccionar una Orden de Compra o Un contrato para crear la Solicitud de Compromiso.'
		RAISERROR(@AUX,16,1)
		RETURN 1
	END
	
	IF RTRIM(@CodOrdenCompra)<>'' AND  RTRIM(@CodContrato)<>''
	BEGIN
		SET @AUX='La Solicitud de Compromiso No puede tener asociada una Orden de Compra y un Contrato a la Vez.'
		RAISERROR(@AUX,16,1)
		RETURN 1
	END
	
	SET @CodOrdenCompra = CASE WHEN RTRIM(@CodOrdenCompra)='' THEN NULL ELSE RTRIM(@CodOrdenCompra) END
	SET @CodContrato = CASE WHEN RTRIM(@CodContrato)='' THEN NULL ELSE LEFT(RTRIM(@CodContrato),23) END
	SET @CodContrato = LEFT(@CodContrato,23)
	
	--- Si es un Contrato y el mismo ya ha sido registrado en el sistema, coloco un consecutivo al codigo de la solicitud de compromiso
	IF RTRIM(@CodContrato)<>''
	BEGIN
		
		SELECT @AUX2=COUNT(*) FROM CompromisoSolicitud WHERE CodContrato=@CodContrato
		SET @AUX= 'SC-' + CASE WHEN @AUX2=0 THEN RTRIM(@CodContrato) ELSE RTRIM(@CodContrato)+' ('+CONVERT(VARCHAR(3),@AUX2+1)+')' END
	END
	ELSE IF RTRIM(@CodOrdenCompra)<>''
	BEGIN 
		SET @AUX= 'SC-' + ISNULL(@CodOrdenCompra,'')
	END
	
	INSERT INTO [dbo].[CompromisoSolicitud]
		(
		 [CodSolicitud]
		,[CodOrdenCompra]
		,[CodContrato]
		,[Observaciones]
		,[CodPresupuesto]
		--,[FechaSolicitud]
		--,[Activo]
		,[Estado]
		,[Usuario]
		,IdProveedor
		,NombreProveedor
		,OrdenGlobal
		)
	VALUES
		(
		 @AUX --'SC_'+ISNULL(@CodOrdenCompra,'')+ISNULL(@CodContrato,'') --CASE WHEN @CodSolicitud IS NULL OR RTRIM(@CodSolicitud)='' THEN 'SC'+ISNULL(@CodOrdenCompra,'')+ISNULL(@CodContrato,'') ELSE @CodSolicitud END
		,@CodOrdenCompra
		,@CodContrato
		,RTRIM(@Observaciones)
		,@CodPresupuesto
		--,@FechaSolicitud
		--,@Activo
		,'PENDIENTE'--@Estado
		,dbo.fnGetUsuarioSession()
		,@IdProveedor
		,RTRIM(@NombreProveedor)
		,@OrdenGlobal		
		)
	
	---- Si la tabla Tiene una columna IDENTITY, Devuelvo el registro del ultimo Indentity INSERTADO
	---- (Esto se hace para que .NET Trabaje correctamente)
	IF @ParamAuxiliar IS NULL
	BEGIN
		SELECT 
			t.*
			,case when t.CodContrato IS null then CodOrdenCompra else CodContrato end as CODIGO 
		FROM 
			[dbo].[CompromisoSolicitud] t
		WHERE 
			t.[Id]=SCOPE_IDENTITY()
	END		
		
	COMMIT TRANSACTION
	RETURN 0
END

--- Si se llega a este punto es porque el @OP indicado no Existe en el Procedimiento Almacenado
IF @OP IS NOT NULL
	BEGIN
	SET @ParamAuxiliar='La Operacion "'+@OP+'" No esta definida en el Procedimiento almacenado "'+OBJECT_NAME(@@PROCID)+'", Revise!.'
	RAISERROR(@ParamAuxiliar,16,1)
	RETURN 1
END

--- CONTROLAR EL ERROR
END TRY
BEGIN CATCH
	--- Recopilo la informacion del error
	DECLARE @ERROR_NUMBER INT=ERROR_NUMBER(),@ERROR_SEVERITY INT=ERROR_SEVERITY(),@ERROR_STATE INT=ERROR_STATE(),@ERROR_PROCEDURE VARCHAR(128)=ERROR_PROCEDURE(),@ERROR_LINE INT=ERROR_LINE(),@ERROR_MESSAGE VARCHAR(2048)=ERROR_MESSAGE()
	--- Si hay transacciones abiertas, hago un rollback, SE ENCIERRA EN UN (TRY-CATCH) PARA QUE NO SE MUESTRE EL ERROR: Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT	
	IF(@@TRANCOUNT>0) BEGIN BEGIN TRY ROLLBACK TRANSACTION END TRY BEGIN CATCH END CATCH END
	--- Ejecuto el SP que controla y registra el error	
    EXEC [spSeguridadMessageException] @OP='MostrarMensaje',@ERROR_NUMBER=@ERROR_NUMBER,@ERROR_SEVERITY=@ERROR_SEVERITY,@ERROR_STATE=@ERROR_STATE,@ERROR_PROCEDURE=@ERROR_PROCEDURE,@ERROR_LINE=@ERROR_LINE,@ERROR_MESSAGE=@ERROR_MESSAGE
	RETURN 1 
END CATCH;
GO

